
# Untitled - By: YANCL - 周四 5月 4 2023
# Single Color RGB565 Blob Tracking Example
# This example shows off single color RGB565 tracking using the OpenMV Cam.

# 板球系统
# 一、声明
import sensor, image, time, math
from time import sleep as 等待
from pyb import millis as 系统运行时间
from pyb import UART    #串口

#二、设置摄像头
sensor.reset()
sensor.set_pixformat(sensor.RGB565)
sensor.set_framesize(sensor.QVGA)
sensor.skip_frames(time = 1000) #延迟1秒等待摄像头校准亮度、白平衡
sensor.set_auto_gain(False)     #关闭自动亮度
#sensor.set_auto_whitebal(False) #关闭自动白平衡
#sensor.set_auto_gain(False,gain_db=-100)    #降低曝光度
#sensor.set_contrast(3)  #提高对比度
sensor.set_brightness(-1)   #降低亮度

clock = time.clock()#声明时钟，用于获取帧速

threshold_index = 0 # 0 for red, 1 for green, 2 for blue
# The below thresholds track in general red/green/blue things. You may wish to tune them...
thresholds = [(30, 100, 15, 127, 15, 127), # generic_red_thresholds
              (30, 100, -64, -8, -32, 32), # generic_green_thresholds
              (0, 30, 0, 64, -128, 0)] # generic_blue_thresholds
#三、创建常量
# 白球阈值=(75, 100, -20, 20, -20, 20)

黑球阈值=(0, 24, -26, 5, 25, -3)
#橙球阈值=(52, 73, 9, 46, 25, 65) # Color Tracking Thresholds (L Min, L Max, A Min, A Max, B Min, B Max)
画面中点=(320/2,240/2)
#X轴舵机端口号=0
#Y轴舵机端口号=1
#X轴舵机中点=90
#Y轴舵机中点=90
#X轴舵机范围=(-35,35)
#Y轴舵机范围=(-35,35)

# Only blobs that with more pixels than "pixel_threshold" and more area than "area_threshold" are
# returned by "find_blobs" below. Change "pixels_threshold" and "area_threshold" if you change the
# camera resolution. "merge=True" merges all overlapping blobs in the image.

roi=(50,35,190,190)#画面

uart = UART(3, 115200)    #串口初始化

# 主循环
while(True):
    #clock.tick()    #用于获取帧速
# 限定窗口范围
    sensor.set_windowing(roi)

#1）获取图像，并识别小球位置
    图像 = sensor.snapshot()

    小球色块们 = 图像.find_blobs([黑球阈值])
    if  小球色块们: #如果找到结果
        小球色块 = max(小球色块们, key = lambda b: b.pixels())#按结果的像素值，找最大值的数据。也就是找最大的色块。
        if 小球色块.w()>2 and 小球色块.h()>2:#过滤掉长宽小于2的结果
            图像.draw_rectangle(  小球色块[0:4],color=(255,0,0))#按寻找色块结果的前四个值，绘制方形，框选识别结果。
            图像.draw_cross(小球色块.cx(),小球色块.cy(),color=(255,0,0))#用结果的中心值坐标，绘制十字
            #小球位置=[小球色块.cx(),小球色块.cy()]

            output_str="[%d,%d]" % (小球色块.cx(),小球色块.cy()) #小球位置xy坐标数据
            print('小球位置:',output_str)   #Openmv打印数据
            uart.write(output_str)   #串口发送小球xy坐标

        else:#没有找到小球
            uart.write('[0,0]')   #串口发送小球xy坐标
            #小球位置=目标量 #告知系统小球达到目标，使系统停转
    else:#没有找到小球
        uart.write('[0,0]')   #串口发送小球xy坐标
        #小球位置=(150,150)    #没找到小球

    #print('小球位置 =', 小球位置)   #打印小球位置
    #print(clock.fps())     #打印帧率
